/*
 * @Author: 李天惊 uf_lee@163.com
 * @Date: 2025-04-12 22:01:34
 * @LastEditors: 李天惊 uf_lee@163.com
 * @LastEditTime: 2025-04-12 22:56:53
 * @FilePath: \leemvvm\lee-mvvm\src\core\reactivity\reactive.ts
 * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved.
 */
import { track, trigger } from "./effect";

// 响应式对象类型
type ReactiveObject = Record<string | symbol, any>;

/**
 * 创建一个响应式对象
 * @param target - 需要转换为响应式的对象
 * @returns 返回一个代理对象，该对象具有响应式能力
 */
export function reactive(target: ReactiveObject): ReactiveObject {
  // 代理对象
  const handler: ProxyHandler<ReactiveObject> = {
    // 获取属性值并添加依赖关系
    get(target, key) {
      // 获取属性值并添加依赖关系
      const result = Reflect.get(target, key);
      // 添加依赖关系
      track(target, key);
      // 返回属性值
      return result;
    },
    // 设置属性值并触发依赖关系
    set(target, key, value) {
      // 设置属性值并触发依赖关系
      const result = Reflect.set(target, key, value);
      // 触发依赖关系
      trigger(target, key);
      // 返回设置结果
      return result;
    },
  };
  return new Proxy(target, handler);
}
